home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / FROMUTS / UNIXLIB37B / src / sys / s / _signal < prev    next >
Text File  |  1992-08-27  |  5KB  |  240 lines

  1. ;    /* _signal.s (c) Copyright 1990 H.Rogers */
  2.  
  3. a1 RN 0
  4. a2 RN 1
  5. a3 RN 2
  6. a4 RN 3
  7. v1 RN 4
  8. v2 RN 5
  9. v3 RN 6
  10. v4 RN 7
  11. v5 RN 8
  12. v6 RN 9
  13. sl RN 10
  14. fp RN 11
  15. ip RN 12
  16. sp RN 13
  17. lr RN 14
  18. pc RN 15
  19.  
  20.     AREA    |C$$code|,CODE,READONLY
  21.  
  22.     IMPORT    |__raise|
  23.  
  24.     EXPORT    raise
  25. raise
  26.     CMP    a1,#0
  27.     MOVEQS    pc,lr
  28.     STMFD    sp,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,lr,pc}
  29.     SUB    sp,sp,#64
  30.     SUB    ip,pc,#4
  31.     MOV    a4,lr
  32.     ADD    a3,sp,#64
  33.     ORR    a2,fp,#&80000000    ; for __backtrace()
  34.     STMFD    sp!,{a2,a3,a4,ip}    ; create signal frame
  35.     ADD    fp,sp,#12
  36.     MOV    v1,sp
  37.     BL    |__raise|
  38.     ADD    sp,v1,#16        ; skip signal frame
  39.     LDMFD    sp,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,pc}^
  40.  
  41.     IMPORT    |__backtrace|
  42.  
  43.     EXPORT    |__core|
  44. |__core|
  45.     MOV    a1,fp
  46.     B    |__backtrace|
  47.  
  48.  
  49.     AREA    |C$$wrcode|,CODE
  50.  
  51.     EXPORT    |__h_sigill|
  52. |__h_sigill|
  53.     STR    lr,[pc,#|__cbreg|-.-8+60]
  54.     ADR    lr,|__cbreg|
  55.     STMIA    lr,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,lr}^
  56.     MOV    a1,#4            ; SIGILL = 4
  57.     STR    a1,[pc,#|__cba1|-.-8]
  58.     B    |__h_cback|
  59.  
  60.     EXPORT    |__h_sigbus|
  61. |__h_sigbus|
  62.     SUB    lr,lr,#4
  63.     STR    lr,[pc,#|__cbreg|-.-8+60]
  64.     ADR    lr,|__cbreg|
  65.     STMIA    lr,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,lr}^
  66.     MOV    a1,#10            ; SIGBUS = 10
  67.     STR    a1,[pc,#|__cba1|-.-8]
  68.     B    |__h_cback|
  69.  
  70.     EXPORT    |__h_sigsegv0|
  71. |__h_sigsegv0|
  72.     SUB    lr,lr,#4
  73.     STR    lr,[pc,#|__cbreg|-.-8+60]
  74.     ADR    lr,|__cbreg|
  75.     STMIA    lr,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,lr}^
  76.     MOV    a1,#11            ; SIGSEGV = 11
  77.     STR    a1,[pc,#|__cba1|-.-8]
  78.     B    |__h_cback|
  79.  
  80.     EXPORT    |__h_sigsegv1|    ; FIXME need to undo any writebacked LDM/STMs
  81. |__h_sigsegv1|
  82.     SUB    lr,lr,#8
  83.     STR    lr,[pc,#|__cbreg|-.-8+60]
  84.     ADR    lr,|__cbreg|
  85.     STMIA    lr,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,lr}^
  86.     MOV    a1,#11            ; SIGSEGV = 11
  87.     STR    a1,[pc,#|__cba1|-.-8]
  88.     B    |__h_cback|
  89.  
  90.     EXPORT    |__h_errbuf|
  91. |__h_errbuf|
  92.     DCD    0
  93.     EXPORT    |__h_error|
  94. |__h_error|
  95.     ADR    lr,|__cbreg|
  96.     STMIA    lr,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,lr}^
  97.  
  98.     LDR    a3,[pc,#|__h_errbuf|-.-8]
  99.  
  100.     LDR    a1,[pc,#errno_ptr-.-8]
  101.     MOV    a2,#36            ; EOS = 36
  102.     STR    a2,[a1,#0]
  103.     LDR    a1,[pc,#sys_errlist_ptr-.-8]
  104.     ADD    a2,a3,#8
  105.     STR    a2,[a1,#144]        ; (EOS<<2) = 144
  106.  
  107.     LDR    a2,[a3,#0]
  108.     STR    a2,[pc,#|__cbreg|-.-8+60]
  109.     MOV    a2,#2
  110.     STR    a2,[pc,#|__cbflg|-.-8]    ; set __cbflg bit 1
  111.     LDR    a2,[a3,#4]
  112.     TST    a2,#&80000000
  113.     BNE    |__h_emt|
  114.     MOV    a1,#20            ; SIGERR = 20
  115.     STR    a1,[pc,#|__cba1|-.-8]
  116.     B    |__h_cback|
  117. |__h_emt|
  118.     BIC    a2,a2,#&80000000
  119.     MOV    a2,a2,LSR #8
  120.     CMP    a2,#&0002
  121.     MOVEQ    a1,#8            ; SIGFPE = 8
  122.     MOVNE    a1,#7            ; SIGEMT = 7
  123.     STR    a1,[pc,#|__cba1|-.-8]
  124.     B    |__h_cback|
  125.     IMPORT    errno
  126. errno_ptr
  127.     DCD    errno
  128.     IMPORT    sys_errlist
  129. sys_errlist_ptr
  130.     DCD    sys_errlist
  131.  
  132.     EXPORT    |__h_sigint|
  133. |__h_sigint|
  134.     TST    fp,#64            ; Escape condition?
  135.     MOVEQS    pc,lr
  136.     MOV    ip,#2            ; SIGINT = 2
  137.     STR    ip,[pc,#|__cba1|-.-8]
  138.     MOV    ip,#1            ; set CallBack
  139.     STR    ip,[pc,#|__cbflg|-.-8]    ; set __cbflg bit 0
  140.     MOVS    pc,lr
  141.  
  142.     EXPORT    |__h_event|
  143. |__h_event|
  144.     MOVS    pc,lr
  145.  
  146.     EXPORT    |__h_sigsys|
  147. |__h_sigsys|
  148.     ADR    ip,|__cbreg|
  149.     STMIA    ip,{lr}
  150.     MOV    ip,#12            ; SIGSYS = 12
  151.     STR    ip,[pc,#|__cba1|-.-8]
  152.     ORR    ip,pc,#3        ; SVC mode
  153.     TEQP    ip,#0
  154.     MOVNV    ip,ip
  155.     STMFD    sp!,{lr}
  156.     SWI    &2001b            ; OS_SetCallBack
  157.     LDMFD    sp!,{lr}
  158.     ADR    ip,|__cbreg|
  159.     LDMIA    ip,{pc}^
  160.  
  161.     EXPORT    |__h_sigalrm|
  162. |__h_sigalrm|
  163.     ADR    ip,|__cbreg|
  164.     STMIA    ip,{lr}
  165.     MOV    ip,#14            ; SIGALRM = 14
  166.     STR    ip,[pc,#|__cba1|-.-8]
  167.     ORR    ip,pc,#3        ; SVC mode
  168.     TEQP    ip,#0
  169.     MOVNV    ip,ip
  170.     STMFD    sp!,{lr}
  171.     SWI    &2001b            ; OS_SetCallBack
  172.     LDMFD    sp!,{lr}
  173.     ADR    ip,|__cbreg|
  174.     LDMIA    ip,{pc}^
  175.  
  176.     EXPORT    |__h_cback|
  177. |__h_cback|
  178.     ORR    lr,pc,#&0c000000    ; USR mode IntOff
  179.     MOVS    pc,lr
  180.     MOVNV    a1,a1
  181.     ADR    lr,|__cbreg|        ; load USR reg.s
  182.     LDMIA    lr,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,lr}
  183.     SUB    sp,sp,#4
  184.     STMFD    sp!,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,lr}
  185.  
  186.     LDR    a4,[pc,#|__cbreg|-.-8+60]
  187.     STR    a4,[sp,#60]        ; saved USR pc
  188.  
  189.     LDR    a1,[pc,#|__cbflg|-.-8]
  190.     ANDS    a1,a1,#2        ; check __cbflg bit 1
  191.     SUBNE    a4,a4,#4
  192.  
  193.     MOV    a3,lr            ; saved USR lr
  194.     ADD    a2,sp,#64        ; saved USR sp
  195.     ORR    a1,fp,#&80000000    ; saved USR fp | 0x80000000
  196.     STMFD    sp!,{a1,a2,a3,a4}    ; create signal frame
  197.     ADD    fp,sp,#12
  198.     SWI    &20013            ; OS_IntOn
  199.  
  200.     LDR    a1,[pc,#|__cbflg|-.-8]    ; check __cbflg bit 0
  201.     ANDS    a1,a1,#1
  202.     BEQ    |__h_cback_l1|
  203.  
  204.     MOV    a1,#&7c         ; clear Escape condition
  205.     SWI    &20006
  206.  
  207. |__h_cback_l1|
  208.     MOV    a1,#0
  209.     STR    a1,[pc,#|__cbflg|-.-8]
  210.     LDR    a1,[pc,#|__cba1|-.-8]
  211.     MOV    v1,sp
  212.     BL    |__raise|
  213.     ADD    sp,v1,#16        ; skip signal frame
  214.     LDMFD    sp,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,lr,pc}^
  215.  
  216.     EXPORT    |__cbreg|
  217. |__cbreg|
  218.     %    64
  219.  
  220.         ; bit 0 Escape condition flag
  221.         ; bit 1 no re-execute inst. flag
  222. |__cbflg|
  223.     DCD    0
  224.  
  225. |__cba1|
  226.     DCD    0
  227.  
  228.  
  229.     IMPORT    |_exit|
  230.  
  231.     EXPORT    |__h_exit|
  232. |__h_exit|
  233.     ORR    lr,pc,#&0c000000    ; USR mode IntOff
  234.     MOVS    pc,lr
  235.     MOVNV    a1,a1
  236.     MOV    a1,#0
  237.     B    |_exit|
  238.  
  239.     END
  240.